#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

// 1.定义server类型
typedef websocketpp::server<websocketpp::config::asio> server_t;

void onOpen(websocketpp::connection_hdl hdl) 
{
    std::cout << "websocket长连接建立成功！" << std::endl;
}

void onClose(websocketpp::connection_hdl hdl)
{
    std::cout << "websocket长连接断开成功！" << std::endl;
}

void onMessage(server_t* server, websocketpp::connection_hdl hdl, server_t::message_ptr msg)
{
    // 1.获取有效消息载荷数据，进行业务处理
    std::string body = msg->get_payload();
    std::cout << "收到消息" << body << std::endl;
    // 2.对客户端进行响应
    // 获取通信连接对象
    server_t::connection_ptr con = server->get_con_from_hdl(hdl);
    // 发送数据
    con->send(body + "-Hello", websocketpp::frame::opcode::text);
}

int main()
{
    // 2.实例化服务器对象
    server_t server;
    // 3.初始化日志输出——关闭日志输出
    server.set_access_channels(websocketpp::log::alevel::none);
    // 4.初始化Asio框架
    server.init_asio();
    // 5.设置消息处理/连接握手成功/连接关闭回调函数
    server.set_message_handler(std::bind(&onMessage, &server, std::placeholders::_1, std::placeholders::_2));
    server.set_open_handler(onOpen);
    server.set_close_handler(onClose);
    // 6.设置地址重用
    server.set_reuse_addr(true);
    // 7.设置监听端口
    server.listen(9191);
    // 8.开始监听
    server.start_accept();
    // 9.启动服务器
    server.run();

    return 0;
}

